package org.lzy.shop

import android.app.Activity
import android.app.Application
import android.content.Context
import android.os.Bundle
import androidx.appcompat.app.AppCompatDelegate
import com.kongzue.dialogx.DialogX
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.SupervisorJob
import kotlinx.coroutines.cancel
import kotlinx.coroutines.launch
import org.lzy.shop.database.CartDatabase
import org.lzy.shop.network.KtorApiService
import org.lzy.shop.network.KtorClient
import org.lzy.shop.util.DataStoreUtils
import org.lzy.shop.util.LanguageUtil
import org.lzy.shop.util.ToastUtil

/**
 * BaseApplication
 * 通过在 AndroidManifest 声明
 * 在应用程序创建时第一个被实例化的
 * 其 onCreate() 在整个应用的生命周期仅执行一次
 * 一般在这个继承 Application 的类中, 我们会进行一些通用工具类、模块的初始化操作
 */

class BaseApplication : Application() {

    // 将applicationScope设置为类成员变量，以便在应用销毁时取消
    private val applicationScope = CoroutineScope(Dispatchers.IO + SupervisorJob())

    override fun onCreate() {
        super.onCreate()
        
        // 首先设置应用上下文，确保全局可访问
        setApplication(this)

        // 初始化核心配置（在主线程，但保持轻量）
        initAppConfig()

        // 异步初始化所有第三方库，避免阻塞主线程
        applicationScope.launch(Dispatchers.IO) {
            initLibraries()
        }

        // 注册Activity生命周期回调
        registerActivityLifecycleCallbacks(activityLifecycleCallbacks)
    }

    /**
     * 初始化第三方库
     */
    private  fun initLibraries() {
        // 初始化 DataStore
        DataStoreUtils.init(this)

        //初始化数据库（非启动关键路径）

        CartDatabase.getDatabase(this@BaseApplication)

        // 初始化网络客户端（非启动关键路径）
        val httpClient = KtorClient.create(this@BaseApplication)
        KtorApiService.init(httpClient)

        // Toast和DialogX可初始化
        ToastUtil.init(this@BaseApplication)
        DialogX.init(this@BaseApplication)
    }

    /**
     * 初始化应用配置
     */
    private fun initAppConfig() {
        // 根据本地保存的标识设置应用语言
        val language = DataStoreUtils.getString(Constant.SP_LANGUAGE)
        LanguageUtil.changeAppLanguage(this, language)


        // 根据本地保存的标识设置夜间模式
        val nightMode = DataStoreUtils.getString(Constant.SP_NIGHTMODE)
        when (nightMode) {
            "night" -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
            "light" -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)
            else -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM)
        }
    }

    companion object {
        // 简化Application Context获取方式，避免复杂的懒加载逻辑
        private lateinit var instance: BaseApplication
        
        @JvmStatic
        fun getContext(): Context {
            return instance
        }

        // 供BaseApplication的onCreate调用，设置应用实例
        fun setApplication(application: BaseApplication) {
            instance = application
        }
    }

    /**
     * Activity生命周期回调
     */
    private val activityLifecycleCallbacks = object : ActivityLifecycleCallbacks {
        override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {
            // 可在这里添加Activity创建时的通用逻辑
        }

        override fun onActivityStarted(activity: Activity) {}
        override fun onActivityResumed(activity: Activity) {}
        override fun onActivityPaused(activity: Activity) {}
        override fun onActivityStopped(activity: Activity) {}
        override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {}
        override fun onActivityDestroyed(activity: Activity) {}
    }


    override fun onTerminate() {
        super.onTerminate()
        // 释放ToastUtil资源
        ToastUtil.release()
        // 取消所有协程任务，防止内存泄漏
        applicationScope.cancel()
    }

}